[AJUDA] Exercicio Registro C

1. [AJUDA] Exercicio Registro C

Lucas Tadeu Teixeira
lucastt182

(usa Ubuntu)

Enviado em 16/06/2010 - 16:11h

Olá, eu queria pedir ajuda dos programadores mais experientes com um exercício de C.

Eis o enunciado:
"Foi realizada uma pesquisa sobre algumas características físicas de 50 habitantes de certa região. De cada habitante foram coletados os seguintes dados: sexo, altura, idade e cor dos olhos(A- azuis, V- verdes, C-castanhos).
Faça um programa que leia os dados armazene-os em um registro tipo vetor e determine:

* a média das pessoas com olhos castanhos e altura superior a 1.60 m;
* a maior idade dos habitantes;
* a quantidade de indivíduos do sexo feminino com idade entre 20 e 45 anos(inclusive) ou que tenham olhos verdes e altura inferior a 1.70m;
* percentual de homens;"

Estou com problemas nos dois últimos requisitos do programa, aqui está meu código ( utilizei um vetor de tamanho 2 no registro apenas para facilitar no processo de debug). Por enquanto estou apenas exibindo a quantidade de homens.
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // a função strupr necessita desta biblioteca

// declarando os registros
struct{

char sexo[1], corOlhos[1];
float altura;
int idade;


} pessoas[2];

int main(){

// declarando as variáveis
int i, k, maiorIdade, qtdMulheres, qtdHomens;
float somaIdades;
char handler[1];

// inserindo os dados no registro
for(i=0;i<2;i++){

printf("\nQual o sexo da %da. pessoa? M/F \n", i+1);
scanf("%s", handler);

// Este loop converte o que handler recebe para maiúsculo.
for(k=0;handler[k]!=''; k++){

handler[k] = toupper(handler[k]);

}

// Fazendo a verificação do que a variável handler recebeu. Se passar na verificação, a variável pessoas[i].sexo recebe o valor de handler.
// Se não passar na verificação, exibe mensagem e retorna ao início do loop
if((strcmp(handler,"M")== 0) || (strcmp(handler, "F")==0)){

for(k=0;handler[k]!=''; k++)

pessoas[i].sexo[k] = handler[k];

} else {

printf("\nSexo inválido, digite apenas M ou F !");
i--;
continue;

}

printf("\nDigite a altura: ");
scanf("%f", &pessoas[i].altura);

printf("\nDigite a idade: ");
scanf("%d", &pessoas[i].idade);

printf("\nQual a cor dos olhos? C(castanhos)/A(azuis)/V(verdes) : ");
scanf("%s", handler);

// Passando o que foi digitado para cor dos olhos para MAIÚSCULO e fazendo a verificação do que foi digitado.
for(k=0; handler[k]!=''; k++)

handler[k] = toupper(handler[k]);

// Verificando se o valor digitado para cor dos olhos é igual a C, A ou V
if((strcmp(handler,"C")==0) || (strcmp(handler,"A")==0) || (strcmp(handler,"V")==0)) {

for(k=0;handler[k]!=''; k++)
pessoas[i].corOlhos[k] = handler[k];

} else {

printf("\n\nA cor dos olhos digitada é inválida! Utilize: C(castanhos), A(azuis) ou V(verdes!\n");
i--;
continue;

}

}

// verificando o registro

somaIdades = 0;
maiorIdade = 0;


for(i=1;i<2;i++){

// soma a idade das pessoas de olhos castanhos e altura superior a 1,60 m
// IMPORTANTE : para fazer a comparação entre 2 STRING's utiliza-se o comando STRCMP( string1, string2) => retorna ZERO se forem iguais
if((strcmp(pessoas[i].corOlhos,"C")==0) && (pessoas[i].altura>1.60)) {

somaIdades += pessoas[i].idade;

}

// verifica qual a maior idade entre as pessoas cadastradas no registro
if(pessoas[i].idade> pessoas[maiorIdade].idade)
maiorIdade = i;



}

qtdMulheres = 0;
qtdHomens = 0;

// é nesta parte aqui embaixo que estou com problemas V

for(i=0;i<2;i++){

// verifica a quantidade de mulheres com idade entre 20 e 45 anos(inclusive). Se a verificação anterior retornar 0(zero), verifica a quantidade de mulheres de olhos verdes e altura //inferior a 1.70 m e salva essa quantidade em uma variável
if(strcmp(pessoas[i].sexo,"F")==0){

// #rofl, essa verificação aqui tá pequena hein :P
if((pessoas[i].idade>20) && (pessoas[i].idade<=45))
qtdMulheres++;

if((strcmp(pessoas[i].corOlhos,"V")==0) && (pessoas[i].altura<1.70))
qtdMulheres++;

}

// calcula a quantidade de homens existentes no cadastro
if(strcmp(pessoas[i].sexo,"M")==0)
qtdHomens++;


}


// exibindo os resultados das verificações

printf("\nA media das idades de pessoas de olhos castanhos e altura superior a 1.60 m é : %3.2f", somaIdades/2);
printf("\nA maior idade das pessoas cadastradas é : %d", pessoas[maiorIdade].idade);
printf("\nA quantidade de mulheres de idade entre 20 e 45 anos(inclusive) ou que tenham olhos verdes e altura inferior a 1.70 m é : %d", qtdMulheres);
printf("\nA quantidade de homens é: %d\n", qtdHomens);

return 0;

}


Obrigado pela atenção (Y)


  


2. Re: [AJUDA] Exercicio Registro C

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 24/09/2010 - 23:14h

Olá!

Analisando rapidamente seu código, percebi um pequeno engano na sua lógica:

// #rofl, essa verificação aqui tá pequena hein :P
if((pessoas[i].idade>20) && (pessoas[i].idade<=45))
qtdMulheres++;

if((strcmp(pessoas[i].corOlhos,"V")==0) && (pessoas[i].altura<1.70))
qtdMulheres++;

O enunciado diz para verificar se mulher com idade entre 21 e 45 OU mulher, olhos verdes e altura menor que 1.70. Na sua implementacao, os dois casos são testados, independente da veracidade ou não do primeiro condicional. Isto é, se for mulher, idade entre 21 e 45, olhos verdes e altura menor que 1.70m, será contabilizada duas vezes. A solução seria trocar o segundo "if" por um "else if".

Quanto a última questão, você está contabilizando o numero de homens, e não o percentual dos mesmos.

Para isso, o percentual é dado por:
Percentual = ( Numero de homens * 100 ) / Numero total de pessoas

Não sei se esse é o erro que se refere. Se não for, por favor descreva ele aqui que faço questão de ajudar na resolução.

Espero ter ajudado!